#ifdef WITH_OPENGL
#pragma once
#include "renderer.h"
#include "driver.h"
#include "matrix.h"
#include <vector>
#include <string>

namespace krryn{
namespace core{
	class job_manager;
}
namespace scene{
	class mesh;
}
namespace system{
	class input_manager;
}
namespace system_imp{
	class window_opengl;
	class renderer_opengl : public system::renderer{
	public:
		renderer_opengl(core::job_manager *a_Manager, const system::viewport_settings &a_Viewport);
		virtual ~renderer_opengl();

		virtual void setup();
		virtual void tear_down();

		virtual system::input_manager* get_input_manager() { return 0; }

		// draw a mesh given a mesh and a local to world transformation matrix
		virtual void draw(scene::mesh *a_Mesh, const math::matrix &a_Transformation);
		virtual view::shader_catalog* get_shader_catalog();

		virtual void begin_scene();
		virtual void end_scene();

		virtual void set_projection_matrix(const math::matrix &a_ProjectionMatrix);
		virtual void set_camera(view::camera *a_Camera);
	private:
		std::vector<std::string> m_Extensions;
		system::viewport_settings m_Viewport;
		math::matrix m_ProjectionMatrix;
		view::camera *m_Camera;
    };
}
}
#endif